# 基于PyQt5的图书管理系统界面的开发

from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.uic import *
import mysql.connector as mysql_conn             # 用于界面数据传送到数据当中数据库

import sys

# 注意！：导入uic的时候，导入不正常，主要是因为同时安装了PyQt5和PyQt5-stubs 只要删除PyQt5-stubs即可

# 实现将ui文件 -- logic逻辑分离st
ui, _ = loadUiType('main.ui')   # 注意这里的下划线代表一个参数只是不用这个参数 （_下划线接收参数，但是不使用）


class MainApp(QMainWindow, ui):

    # 定义构造方法
    def __init__(self):
        QMainWindow.__init__(self)
        self.setupUi(self)
        self.handle_ui_change()         # 也就是在初始化的界面当中应该是隐藏了主题弹框
        self.handle_buttons()           # 也就是初始化的界面当中应该是调用所有的按钮功能

    # ui变化处理
    def handle_ui_change(self):
        self.hide_themes()
        self.tabWidget.tabBar().setVisible(False)   # 这里是做了一个将选项卡的顶部名称进行隐藏

    # 界面当中所有的button都需要制作信号和槽的通信处理
    def handle_buttons(self):
        self.themeButton.clicked.connect(self.show_themes)    # 也就是将主题按钮的点击信号和显示主题的槽相连接
        self.theme_change_Button.clicked.connect(self.hide_themes)
        # 上面这样是将主题的选择框做成可以弹出和缩回的形式主要是为了在有限的空间内显示更多的内容
        self.bookButton.clicked.connect(self.open_book_tab)
        # 上面是将图书按钮与选项卡的第一个选项关联起来。也就达到了点击一下就能将界面调节到对应的选项卡
        self.settingButton.clicked.connect(self.open_setting_tab)
        # 上面是将设置按钮与选项卡的第二个选项关联起来。也就达到了点击一下就能将界面调节到对应的选项卡
        self.add_catagory_Button.clicked.connect(self.add_category)
        # 上面是将类别的提交按钮信号与将信息添加到数据库当中相连接

    # 主题的显示
    def show_themes(self):
        self.theme_groupBox.show()   # 也就是显示出主题框

    # 主题的隐藏
    def hide_themes(self):
        self.theme_groupBox.hide()  # 也就是将主题隐藏

    # 选项卡联动
    def open_book_tab(self):
        self.tabWidget.setCurrentIndex(0)    # 这里可以在QT Designer中的对应位置找到名称，即选项卡的第一个选项的索引是0
        # 这样就将book按钮与选项卡的第一个选项相关联起来了

    def open_setting_tab(self):
        self.tabWidget.setCurrentIndex(1)
        # 也就是设定一个设置按钮的信号槽

    # 数据库处理
    # 1.添加类别
    def add_category(self):
        # 数据库操作流程
        # 第一步：获取连接
        conn = get_conn()
        # 第二步：获取cursor
        cur = conn.cursor()
        # 第三步： sql语句
        sql = 'insert into category(category_name) values(%s)'
        category_name = self.add_category_name.text()
        # 这里的含义就是将填入分类名的内容给数据库（类别数据库当中对应的类别名上）
        # 第四步：执行语句
        cur.execute(sql, (category_name, ))      # 注意：引用的数据是以元组的而形式传递的，同时若只有一个数据那么需要在后面加一个逗号！
        # 这里就是执行之前的sql语句，也就是将界面当中的类别的输入框内内容添加到数据库--类别表当中的类别名那一栏当中
        # 第五步：insert、update、delete操作都必须进行指令提交
        conn.commit()
        # 第六步：关闭资源
        close_conn(conn, cur)
        # 第七步：消息提示
        self.statusbar().showMessage('类别添加成功！')


def main():
    app = QApplication([])     # 也就是做一个无参数的app
    window = MainApp()
    window.show()              # 运行window（或者是先是出app）
    app.exec_()                # 对app不断循环监听


if __name__ == '__main__':
    main()

# 补充思路：对于下拉菜单的数据，我们应该是完成设置信息的基本基础信息。
#         也就是下在设置当中添加相应的作者、类型、出版社等信息，并将起添加到数据库当中

##############################################################################
# 以下是进行界面的数据与数据库的连接
# 获取连接


def get_conn():
    try:
        conn = mysql_conn.connect(host='localhost',
                                  database='library',
                                  user='root',
                                  password='123456')
        return conn
    except mysql_conn.Error:
        print('数据库连接异常')


# 关闭连接 （一定要注意关闭连接，因为十分耗时和占据资源）
def close_conn(conn, cursor):
    try:
        if cursor:
            cursor.close()
        if conn:
            conn.close()
    except mysql_conn.Error:
        print('数据库关闭异常')
    finally:
        cursor.close()
        conn.close()

# print(get_conn())  # 用于测试是否可以数据库的连接
